package com.yox.rpc.factory;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * DCL单例工厂，保证一个类只有一个实例，节约资源，保证线程安全,
 * 对象是强引用，对象被引用的时候是不会被垃圾回收的，没有被引用才会被回收
 * 如果Map的value使用WeakReference<Object>,则是弱引用，被垃圾回收器扫到就会被回收
 *
 * 关于单例工厂模式：https://blog.csdn.net/w2556089/article/details/78223431
 */
public class SingletonFactory {

    private static Map<Class, Object> objectMap = new ConcurrentHashMap<>();

    private SingletonFactory(){}

    public static <T> T getInstance(Class<T> clazz) {
        Object instance = objectMap.get(clazz);
        if (instance == null) {
            //锁住类保证线程安全
            synchronized (clazz){
                if(instance == null){
                    try {
                        instance = clazz.newInstance();
                    }catch (IllegalAccessException | InstantiationException e) {
                        throw new RuntimeException(e.getMessage(), e);
                    }
                    objectMap.put(clazz, instance);
                }
            }
        }
        return clazz.cast(instance);
    }
}
